/* 这个 app.js 这个模块一般叫做主模块，组织其他的模块进行使用。其他的模块一般叫做功能模块，提供相关的功能 */
/* 
 require('./m1.js');

1. 代表引入 m1 这个模块
2. 由于这个模块是自己写的模块，则必须加上路径，不能省略
    - 传统的开发，一般当前目录的文件我们是可以省略 ./ 但是如果是移入自己的模块，./ 相对路径不能省略
3. 使用 require 导入模块后，我们需要使用一个变量或者一个常量进行接受
    - 由于我们是使用的别人的模块，一般不会对模块内部做操作，所以一般使用常量来接收
    - 接收常量的标识符一般和模块的明文一致，模块的名称一般就是说的是文件的名称，一般也叫做模块ID    
*/
// const m1 = require('m1.js'); // 错误写法，省略了 ./ 是不可以的

const m1 = require('./m1.js');
const m2 = require('./m2.js');
const m3 = require('./m3.js');

/* /* Person是一个类，到时候使用 require 接受的就是这样类
    module.exports = Person;
*/

const Person = require('./Person.js'); // m4 === Person


console.log('m1模块：', m1, typeof (m1)); // m1模块： {} object
console.log('m2模块：', m2, typeof (m2)); // m1模块： {} object
console.log('m3模块：', m3, typeof (m3)); // m1模块： {} object
console.log('Person模块：', Person, typeof (Person)); // m1模块： {} object

// 可以通过 m1 使用到暴露出来的成员
console.log('获取模块的名称：', m1.moduleName);
console.log('获取模块的版本：', m1.m1Version);
console.log('调用模块的加法：', m1.add(1, 2));
/* 使用可以是否 m1 里面的 PI 常量？ */

console.log('获取模块的常量：', m1.PI);

console.log('=======================使用m2模块里面的成员=======================');
console.log('获取模块 m2 的名称：', m2.moduleName);
console.log('获取模块 m2 的版本：', m2.m2Version);

console.log('调用模块 m2 的加法：', m2.sum(1, 2));

console.log('=======================使用m4模块里面的成员=======================');
/* 如果是方式一暴露，要使用m4里面的类成员 */
// const p1 = new m4.Person('张三', 20);

/* Person是一个类，到时候使用 require 接受的就是这样类  */
const p1 = new Person('张三', 20);
// 打印p1
console.log('打印p1:', p1);
p1.say();